using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.ServiceModel.Activation;
using Didsoft.Core.Exceptions;
using ICIA.ARojas.AccesoDatos.Entidades;
using ICIA.ARojas.AccesoDatos.Contexto;
using ICIA.ARojas.AccesoDatos.Contratos;
using ICIA.ARojas.Negocios.Servicios;
using ICIA.ARojas.AccesoDatos.Entidades.DTO;


namespace ICIA.ARojas.Negocios
{
   /// <summary>
   /// Implementacion de la interface IDestinoNegociosServicio, los metodos que estan definidos en el contrato IDestinoNegociosServicio serán accesibles desde un contexto externo
   /// </summary>
   [WcfErrorBehavior]
   [WcfSilverlightFaultBehavior]
   [AspNetCompatibilityRequirements(RequirementsMode = AspNetCompatibilityRequirementsMode.Allowed)]	
   public class DestinoNegocios : IDestinoNegociosServicio
   {
	private IDestinoAccesoDatos dataAccess;
	public DestinoNegocios() 
	{
		//dataAccess = Didsoft.Core.Factory.Singleton<DestinoAccesoDatos>.GetInstance();
		dataAccess = new DestinoAccesoDatos();
	}
	
	/// <summary>
    /// Devuelve una lista de Destino's de las ocurrencias encontradas a partir del filtro
    /// </summary>    
	public List<Destino> BuscarPorFiltro(string filtro)
	{
		return dataAccess.BuscarPorFiltro(filtro).ToList();
	}

    public List<Destino> BuscarPorPersonaId(int PersonaId)
    {
        List<Destino> destinos =  dataAccess.BuscarPorPersonaId(PersonaId);

        IObservacionesAccesoDatos oad = new ObservacionesAccesoDatos();

        foreach (Destino destino in destinos)
        {
            destino.TieneObservaciones = oad.BuscarPorDestinoId(destino.Id).Count > 0 ? true : false;
        }
        return destinos;
    } 

	#region operacione básicas
	
	/// <summary>
    /// Elimina la entidad Destino, lanzará una excepcion si la entidad guarda dependencia a otras entidades
    /// </summary>	
	public void Eliminar(Destino entidad)
	{
		dataAccess.Delete(entidad);
	}
	
	/// <summary>
    /// Devuelve Destino, buscada por su Id, si no existe, entonces devuelve null
    /// </summary>	
	public Destino ObtenerPorId(object Id)
	{
		return dataAccess.GetById(Id);
	}

	/// <summary>
    /// Devuelve List<Destino>, de todas la entidades de ese tipo
    /// </summary>	
	public List<Destino> ObtenerTodas()
	{
		return dataAccess.GetAll().ToList();
	}
	
	/// <summary>
    /// Guarda Destino, previa ejecucion satisfactoria de las reglas de negocio
    /// </summary>	
	public Destino Guardar(Destino entidad)
	{
        if (entidad.Cargo == null)
            throw new Exception("Necesita Seleccionar Cargo");
        
        TipoDestinoAccesoDatos tdad = new TipoDestinoAccesoDatos();
        entidad.TipoDestino = new TipoDestino(){NombreTipo = "Destino",Descripcion="descripcion"};
        tdad.Insert(entidad.TipoDestino);
        
		//Agregar aqui las reglas de negocio.......		
		if (entidad.Id == 0)
			dataAccess.Insert(entidad);
		else
			dataAccess.Update(entidad);

		return entidad;
	}

	#endregion


    #region reportes


    public List<DTODestino> ReportePorGestion(int gestion)
    {
        List<Destino> items = dataAccess.BuscarPorGestion(gestion).ToList();

        List<DTODestino> resultados = new List<DTODestino>();
        
        foreach (var destino in items)
        {
            DTODestino dto = new DTODestino();
            dto.Gestion = destino.Gestion;
            dto.Grado =destino.Persona!=null?destino.Persona.Grado.Nombre:string.Empty;
            dto.CedulaMilitar = destino.Persona!=null?destino.Persona.CedulaMilitar:string.Empty;
            dto.Apellidos = destino.Persona!=null?destino.Persona.Apellidos:string.Empty;
            dto.Nombres = destino.Persona != null ? destino.Persona.Nombre : string.Empty;
            dto.DestinoFisico = destino.DestinoFisico.Nombre;
            dto.Cargo = destino.Cargo!=null?destino.Cargo.NombreCargo:string.Empty;
            dto.FechaDestino = destino.FechaRegistro;

            resultados.Add(dto);
        }

        return resultados;
    }

    #endregion

   }
}


